{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MhoQ0WE77laV"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "_ckMIh7O7s6D"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "vasWnqRgy1H4"
      },
      "outputs": [],
      "source": [
        "#@title MIT License\n",
        "#\n",
        "# Copyright (c) 2017 François Chollet\n",
        "#\n",
        "# Permission is hereby granted, free of charge, to any person obtaining a\n",
        "# copy of this software and associated documentation files (the \"Software\"),\n",
        "# to deal in the Software without restriction, including without limitation\n",
        "# the rights to use, copy, modify, merge, publish, distribute, sublicense,\n",
        "# and/or sell copies of the Software, and to permit persons to whom the\n",
        "# Software is furnished to do so, subject to the following conditions:\n",
        "#\n",
        "# The above copyright notice and this permission notice shall be included in\n",
        "# all copies or substantial portions of the Software.\n",
        "#\n",
        "# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n",
        "# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n",
        "# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n",
        "# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n",
        "# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n",
        "# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n",
        "# DEALINGS IN THE SOFTWARE."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jYysdyb-CaWM"
      },
      "source": [
        "# <div dir=\"rtl\">أساسيّات التّصنيف: تصنيف صور الملابس</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "S5Uhzt6vVIB2"
      },
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"right\" dir=\"rtl\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/tutorials/keras/classification?hl=ar\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />إفتح المحتوى على موقع TensorFlow.org</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ar/tutorials/keras/classification.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />تفاعل مع المحتوى على Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs-l10n/blob/master/site/ar/tutorials/keras/classification.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />إطّلع على المصدر في Github</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a href=\"https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ar/tutorials/keras/classification.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />تنزيل الدّفتر</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c-KxbLvi-t06"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "Note: قامت مجموعة المتطوعين في مشروع Tensorflow بترجمة هذا المحتوى. نظرًا لأن هذه الترجمات تعتمد على قاعدة أقصى الجهد (best-effort) ، فلا نضمن أنها انعكاس دقيق وحديث [للمحتوى الرسمي باللغة الإنجليزية](https://www.tensorflow.org/?hl=en). إذا كانت لديك اقتراحات لتحسين هذه الترجمة ، يرجى إرسال \"Pull request\" إلى مشروع [tensorflow/docs-l10n](https://github.com/tensorflow/docs-l10n). للتطوع أو مراجعة ترجمات المجموعة يرجى ارسال ايميل إلى docs@tensorflow.org.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FbVhjPpzn6BM"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "نقوم في هذا الدّليل بتدريب نموذج شبكة عصبيّة لتصنيف الملابس، مثل الأحذية الرياضية و القمصان. \n",
        "لابأس إن لم تفهم كلّ التّفاصيل،\n",
        "فهذا درس تفاعليّ ذو نسق سريع\n",
        "يعطي نظرة عامّة عن كيفية اِستعمال \n",
        "Tensorflow \n",
        "في برنامج\n",
        "كامل و ستتوضّح التفاصيل أثناء تقدّمك. \n",
        "\n",
        "يستخدم هذا الدليل واجهة برمجة التطبيقات \n",
        "[tf.keras](https://www.tensorflow.org/guide/keras)، \n",
        "و هي واجهة برمجة \n",
        "(API)\n",
        "عالية المستوى تمكّن من بناء و تدريب النماذج في \n",
        "Tensorflow\n",
        "بسهولة.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "dzLKpmZICaWN"
      },
      "outputs": [],
      "source": [
        "# TensorFlow and tf.keras\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "\n",
        "# Helper libraries\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "print(tf.__version__)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yR0EdgrLCaWR"
      },
      "source": [
        "## <div dir=\"rtl\">حمّل مجموعة بيانات Fashion MNIST</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DLdCchMdCaWQ"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "يستخدم هذا الدّليل مجموعة بيانات \n",
        "[Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist)\n",
        "(أي MNIST الموضة).\n",
        "و هي مجموعة بيانات تحتوى على 70000 صورة ذات تدرّج رمادي\n",
        "(greyscale images).\n",
        "تنقسم الصّور إلى 10 أنواع من الملابس، سننظر فيها لاحقا. \n",
        "تظهر كل صورة نوعا واحدًا من الملابس بدقّة منخفضة \n",
        "(28 × 28 بكسل)، \n",
        "كما هو موضّح هنا:\n",
        "\n",
        "</div>\n",
        "\n",
        "<table dir=\"ltr\">\n",
        "  <tr><td>\n",
        "    <img src=\"https://tensorflow.org/images/fashion-mnist-sprite.png\"\n",
        "         alt=\"Fashion MNIST sprite\"  width=\"600\">\n",
        "  </td></tr>\n",
        "  <tr><td align=\"center\">\n",
        "    <b>Figure 1.</b> <a href=\"https://github.com/zalandoresearch/fashion-mnist\">Fashion-MNIST أمثلة من</a> (by Zalando, MIT License).<br/>&nbsp;\n",
        "  </td></tr>\n",
        "</table>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "تمّ تصميم \n",
        "Fashion MNIST\n",
        "لتكون بديلا مباشرا لمجموعة البيانات الكلاسيكية \n",
        "[MNIST](http://yann.lecun.com/exdb/mnist/)\n",
        "و التّي تعتبر المثال الأوّل، أو مثال\n",
        "\"مرحبا يا عالم\"\n",
        "(\"Hello, word\")\n",
        "لبرامج تعلّم الآلة في مجال رؤية الكمبيوتر. \n",
        "و تحتوى مجموعة بيانات \n",
        "MNIST\n",
        "على صور للأعداد من 0 إلى 9 مكتوبة بخط اليد من قِبَلِ العديد من الأشخاص حيث أنّ تنسيق الصور فيها مماثل لتنسيق الصور الموجودة في \n",
        "Fashion MNIST\n",
        "و التّي سنستخدمها في هذا الدّرس.  \n",
        "\n",
        "يستخدم هذا الدّليل \n",
        "Fashion MNIST\n",
        "لتنويع الأمثلة للمتعلّم، و لأنّ تصنيف الملابس هي مشكلة أكثر تحدّيا قليلا من مشكلة تصنيف الأرقام الموجودة في مجموعة بيانات \n",
        "MNIST \n",
        "الكلاسيكية.\n",
        "كِلتا مجموعتي البيانات صغيرتان نسبيًّا و يتمّ اِستخدمهما في الغالب للتحقّق من أنّ أيّ خوارزميّة بصدد التطوير تعمل كما هو متوقّع.\n",
        "فهما إذن نقطتا إنطلاق جيّدتان لاختبار البرامج و تصحيحها.\n",
        "\n",
        "في التّالي، سنستخدم 60000 صورة لتدريب الشبكة العصبيّة و 10000 صورة \n",
        "لتقييم مدى دقّة الشبكة في تصنيف الصّور.\n",
        "يمكنك الوصول الى مجموعة بيانات \n",
        "Fashion MNIST\n",
        "مباشرة من \n",
        "Tensorflow.\n",
        "يمكنك القيام بذلك عن طريق استيراد و تحميل بيانات\n",
        "Fashion MNIST\n",
        "من Tensorflow\n",
        "كالتّالي:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7MqDQO0KCaWS"
      },
      "outputs": [],
      "source": [
        "fashion_mnist = keras.datasets.fashion_mnist\n",
        "\n",
        "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "t9FDsUlxCaWW"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "عمليّة تحميل البيانات السّابقة تُرجع أربعة صفائف \n",
        "NumPy:\n",
        "\n",
        "*   تُكوِّن الصفيفتان \n",
        "`train_images`\n",
        "و `train_labels`\n",
        "مجموعة بيانات التّدريب\n",
        "(training set).\n",
        " أي البيانات التّي سيستخدمها النّموذج للتعلّم. \n",
        "* بعد التّدريب، يتمّ اختبار النموذج باستعمال \n",
        " **مجموعة الاختبار**\n",
        " (test set)\n",
        " و هي تتكوّن من الصفيفتان \n",
        " `test_images`\n",
        "و \n",
        "`test_labels`.\n",
        "\n",
        "بعد تحميلها في الذّاكرة، ستكون الصّور متمثّلة في صفائف NumPy، أي\n",
        "NumPy arrays،\n",
        "ذات أبعاد\n",
        "28x28، \n",
        "حيث ستكون قيمة كل بكسل عدَدًا طبيعيّا بين 0 و 255.\n",
        "بينما تكون التسميات \n",
        "(labels)\n",
        "متمثلة في \n",
        "صفيفة متكوّنة من أعداد صحيحة طبيعية تكون قيمة كل منها بين 0 و 9.\n",
        "يتوافق كلّ عدد مع \n",
        "*فئة*\n",
        "الملابس التّي تمثّلها الصورة:\n",
        "\n",
        "</div>\n",
        "\n",
        "<table>\n",
        "  <tr>\n",
        "    <th>Label</th>\n",
        "    <th>Class</th>\n",
        "    <th>Arabic Class</th>\n",
        "  </tr>\n",
        "  <tr>\n",
        "    <td>0</td>\n",
        "    <td>T-shirt/top</td>\n",
        "    <td>تي شيرت</td>\n",
        "  </tr>\n",
        "  <tr>\n",
        "    <td>1</td>\n",
        "    <td>Trouser</td>\n",
        "    <td>سِرْوال</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>2</td>\n",
        "    <td>Pullover</td>\n",
        "    <td>كنزة صوفية</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>3</td>\n",
        "    <td>Dress</td>\n",
        "    <td>فستان</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>4</td>\n",
        "    <td>Coat</td>\n",
        "    <td>معطف</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>5</td>\n",
        "    <td>Sandal</td>\n",
        "    <td>صندل</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>6</td>\n",
        "    <td>Shirt</td>\n",
        "    <td>قميص</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>7</td>\n",
        "    <td>Sneaker</td>\n",
        "    <td>حذاء رياضي</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>8</td>\n",
        "    <td>Bag</td>\n",
        "    <td>حقيبة</td>\n",
        "  </tr>\n",
        "    <tr>\n",
        "    <td>9</td>\n",
        "    <td>Ankle boot</td>\n",
        "    <td>حذاء الكاحل</td>\n",
        "  </tr>\n",
        "</table>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "يتمّ تعيين تسمية واحدة لكلّ صورة. بما أنّ \n",
        "*أسماء الفئات*\n",
        "(class names)\n",
        "لن تُضَمّنَ في مجموعة البيانات، \n",
        " سنقوم بتخزينها في المتغيّر\n",
        "(variable)\n",
        "المسمّى \n",
        "`class_names`\n",
        "حتّى نتمكّن من إستخدامها لاحقا عند رسم النتائج أو البيانات أو الصّور:\n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "IjnLH5S2CaWx"
      },
      "outputs": [],
      "source": [
        "class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',\n",
        "               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Brm0b_KACaWX"
      },
      "source": [
        "## <div dir=\"rtl\">استكشف البيانات</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "لنبدأ أوّلا باستكشاف شكل البيانات قبل القيام بتدريب النّموذج. \n",
        "في التّالي يمكننا أنّ نرى أنّ مجموعة بيانات التّدريب\n",
        "الموجودة في المتغيّر \n",
        "`train_images`\n",
        "تحتوى على 60000 صورة، \n",
        "حيث أنّ كلّ صورة متمثّلة في \n",
        "28 × 28 بكسل:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "zW5k_xz1CaWX"
      },
      "outputs": [],
      "source": [
        "train_images.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cIAcvQqMCaWf"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "و بطريقة مماثلة، يبلغ عدد التّسميات \n",
        "(labels)\n",
        "في مجموعة التّدريب \n",
        "60000 \n",
        "و هي موجودة في المتغيّر \n",
        "`train_labels` :\n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TRFYHB2mCaWb"
      },
      "outputs": [],
      "source": [
        "len(train_labels)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YSlYxFuRCaWk"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "كل تسمية هي عدد صحيح طبيعي قيمته بين 0 و 9:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XKnCTHz4CaWg"
      },
      "outputs": [],
      "source": [
        "train_labels"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TMPI88iZpO2T"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "هناك 10000 صورة في مجموعة الإختبار \n",
        "(test set).\n",
        "هنا أيضا،  كلّ صورة متمثّلة في 28 × 28 بكسل: \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2KFnYlcwCaWl"
      },
      "outputs": [],
      "source": [
        "test_images.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rd0A0Iu0CaWq"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "و تحتوى مجموعة الإختبار، أيضا، على 10000 تسمية:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iJmPr5-ACaWn"
      },
      "outputs": [],
      "source": [
        "len(test_labels)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ES6uQoLKCaWr"
      },
      "source": [
        "## <div dir=\"rtl\">معالجة البيانات</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "يجب معالجة البيانات مسبقًا قبل القيام بتدريب نموذج الشبكة العصبيّة.\n",
        "إذا قمنا بفحص الصّورة الأولى في مجموعة التّدريب، سنرى أنّ قيمة كلّ بكسل هي بين 0 و 255: \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m4VEw8Ud9Quh"
      },
      "outputs": [],
      "source": [
        "plt.figure()\n",
        "plt.imshow(train_images[0])\n",
        "plt.colorbar()\n",
        "plt.grid(False)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Wz7l27Lz9S1P"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "خفّض قيمة البكسلات من نطاقها الحاليّ من 0 إلى 255 إلي \n",
        "النّطاق من 0 إلى 1 قبل استخدمها لتدريب النّموذج. \n",
        "للقيام بذلك، قم بقسمة كلّ القيم على أكبر عدد في النّطاق الأوّل وهو 255.\n",
        "من المهمّ معالجة \n",
        "*مجموعة التّدريب*\n",
        "و\n",
        "*مجموعة الإختبار*\n",
        "بنفس الطّريقة:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bW5WzIPlCaWv"
      },
      "outputs": [],
      "source": [
        "train_images = train_images / 255.0\n",
        "\n",
        "test_images = test_images / 255.0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ee638AlnCaWz"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "للتأكّد من أنّ البيانات بالتّنسيق الصحيح و أنّنا جاهزون للبدء ببناء و تدريب الشبكة العصبيّة، فلنعرض أوّل 25 صورة \n",
        "من\n",
        "*مجموعة التّدريب*\n",
        "و نعرض إسم كلّ فئة تحت الصورة.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "oZTImqg_CaW1"
      },
      "outputs": [],
      "source": [
        "plt.figure(figsize=(10,10))\n",
        "for i in range(25):\n",
        "    plt.subplot(5,5,i+1)\n",
        "    plt.xticks([])\n",
        "    plt.yticks([])\n",
        "    plt.grid(False)\n",
        "    plt.imshow(train_images[i], cmap=plt.cm.binary)\n",
        "    plt.xlabel(class_names[train_labels[i]])\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "59veuiEZCaW4"
      },
      "source": [
        "## <div dir=\"rtl\">بناء النّموذج</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "يتطلّب بناء الشبكة العصبيّة \n",
        "تعديل معلمات \n",
        "(parameters)\n",
        "طبقات النموذج،\n",
        "ثمّ تجميعه \n",
        "(compile the model).\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Gxg1XGm0eOBy"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "### تعديل طبقات النّموذج\n",
        "\n",
        "تمثّل\n",
        "*الطّبقة* \n",
        "(layer)\n",
        "اللّبنة الأساسية لبناء الشبكة العصبيّة.\n",
        "تقوم الطبقات باستخراج \n",
        "التمثيلات \n",
        "(representations)\n",
        "من البيانات التّي يتمّ إدخالها فيها.\n",
        "مع أمل أن تكون هذه التمثيلات \n",
        "ذات معنى مساعد على حلّ المشكلة المطروحة.\n",
        "\n",
        "معظم التعلّم العميق \n",
        "(deep learning)\n",
        "يتمثّل في ربط طبقات بسيطة معا. \n",
        "معظم هذه الطبقات، مثل\n",
        "`tf.keras.layers.Dense`،\n",
        "لديها معلمات \n",
        "(parameters)\n",
        "تُتَعلَّمُ\n",
        "أثناء عمليّة تدريب النّموذج.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9ODch-OFCaW4"
      },
      "outputs": [],
      "source": [
        "model = keras.Sequential([\n",
        "    keras.layers.Flatten(input_shape=(28, 28)),\n",
        "    keras.layers.Dense(128, activation='relu'),\n",
        "    keras.layers.Dense(10)\n",
        "])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gut8A_7rCaW6"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تُحوّل الطبقة الأولى من الشبكة، \n",
        "`tf.keras.layers.Flatten`،\n",
        "تنسيق الصور من صفيفة \n",
        "(array)\n",
        "ثنائية الأبعاد (28 × 28 بكسل) \n",
        "إلى صفيفة أحاديّة البعد (28 * 28 = 784 بكسل).\n",
        "فكّر في هذه الطبقة على أنّها تقوم بعمليّة تفريق الخطوط الأفقيّة للبكسلات في صورة ما، بعضها عن بعض\n",
        "،ثمّ تقوم بتصفيفها في خطّ واحد.\n",
        "لا نحتاج لتعلّم أيّ معلمات \n",
        "(parameters)\n",
        "لضبط هذه الطبقة، فهدفها الوحيد هو إعادة تنسيق البيانات.\n",
        "\n",
        "بعد تحويل صفيفة البكسلات، ذات البعدين، المكوّنة للصورة للحصول على صفيفة ذات بعد واحد، يتكوّن باقي الشبكة من تَسلسُل لطبقتين \n",
        "من نوع\n",
        "`tf.keras.layers.Dense`.\n",
        "و هي طبقات عصبيّة متّصلة بكثافة\n",
        "(densely connected)\n",
        "أو تسمّى أيضا \n",
        "متّصلة بالكامل\n",
        "(fully connected).\n",
        "أولّ طبقة متّصلة بالكامل \n",
        "(`Dense` layer)\n",
        "تتكوّن من 128 عقدة\n",
        "(خليّة عصبيّة).\n",
        "ثاني (و آخر) طبقة متّصلة بالكامل تُخرج صفيفة لوجيت \n",
        "([logits](https://en.wikipedia.org/wiki/Logit) array)\n",
        "تتكوّن من 10 عناصر.\n",
        "بما أنّ كُلّ عقدة من الطبقة الأخيرة تهتمّ بفئة معيّنة من الملابس فإنّ كل قيمة من القيم الموجودة في صفيفة اللّوجيت تشير إلى احتمال أنّ الصورة الحاليّة تحتوى على الفئة \n",
        "التّي تُركّز عليها العقدة. \n",
        "\n",
        "</div>\n",
        "\n",
        "### <div dir=\"rtl\">جمع النّموذج</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "قبل أن يصبح النموذج جاهزًا للتدريب، يحتاج إلى بعض الإعدادات الإضافية \n",
        "و التّي تتمّ إضافتها \n",
        "في خطوة تجميع النّموذج\n",
        "(model compiling)\n",
        "و التّي تقوم بها الدّالة \n",
        "`model.compile`.\n",
        "و هذه الإعدادات هي:\n",
        "\n",
        "* *دالّة الخسارة*\n",
        "(Loss function) - \n",
        " تقيس مدى دقّة النموذج أثناء التدريب. هدفك هو أن تبنِيَ نموذجا يقوم بتقليل قيمة هذه الدّالة في كُلّ خطوة من عمليّة التدريب حتى تقوم \"بتوجيه\" النموذج في الاتجاه الصحيح. \n",
        "* *مُحسِّن* \n",
        "(Optimizer) - هذه هي الطريقة التي يتم بها تحديث النموذج بناءً على البيانات التي يراها و دالّة الخسارة الخاصة به.\n",
        "* *المقاييس*\n",
        "(Metrics) -\n",
        "تُستخدم لمراقبة أداء النموذج عند التّدريب و الاختبار.  يستخدم المثال التّالى مقياس *الدّقة* ، \n",
        "وهي تتمثّل في نسبة الصور المصنّفة بشكل صحيح.  \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Lhan11blCaW7"
      },
      "outputs": [],
      "source": [
        "model.compile(optimizer='adam',\n",
        "              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
        "              metrics=['accuracy'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qKF6uW-BCaW-"
      },
      "source": [
        "## <div dir=\"rtl\">تدريب النموذج</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "تتطلّب عمليّة تدريب نموذج الشبكة العصبيّة الخطوات التّالية:\n",
        "\n",
        "1. لقّم بيانات التّدريب للنموذج. في هذا المثال، بيانات التدريب موجودة في الصفيفتان \n",
        "`train_images`\n",
        "و\n",
        "`train_labels`.\n",
        "2. يتعلّم النموذج العلاقة بين الصّور و التسميات \n",
        "(labels)\n",
        " و يربط بينهما.\n",
        "3. أطلب من النموذج القيام بالتنبؤ على مجموعة بيانات الاختبار. و التي هي موجودة في الصفيفة\n",
        "`test_images`.\n",
        "4. تحقّق إلى أيّ مدى تُطابق تنبؤات النموذج التسميات الحقيقية الموجودة في الصفيفة \n",
        "`test_labels`.\n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Z4P4zIV7E28Z"
      },
      "source": [
        "### <div dir=\"rtl\">لقّم النموذج</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "لبدء عمليّة التدريب، نادي الدّالة \n",
        "`model.fit`\n",
        "و هي تسمّى كذلك \n",
        "(fit)\n",
        "لأنّها تقوم بتعديل معلمات \n",
        "النموذج\n",
        "حتّى يتناسب \n",
        "(fits)\n",
        "مع البيانات:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xvwvpA64CaW_"
      },
      "outputs": [],
      "source": [
        "model.fit(train_images, train_labels, epochs=10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "W3ZVOhugCaXA"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "أثناء تدريب النموذج، يتم عرض مقاييس الخسارة والدقة. بعد إتمام التدريب، يصل هذا النموذج إلى دقة تبلغ حوالي 0.91 (أو 91%) في بيانات التدريب.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wCpr6DGyE28h"
      },
      "source": [
        "### <div dir=\"rtl\">تقييم الدقة</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "بعد ذلك، قارن أداء النموذج في مجموعة بيانات الاختبار:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "VflXLEeECaXC"
      },
      "outputs": [],
      "source": [
        "test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)\n",
        "\n",
        "print('\\nTest accuracy:', test_acc)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yWfgsmVXCaXG"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "اِتّضح أنّ دقّة النموذج على مجموعة الاختبار أقلّ بقليل من دقّته على بيانات التدريب. \n",
        "هذه الفجوة بين دقّة التدريب و دقّة الاختبار تمثّل ما يسمّى ب\n",
        "overfitting،\n",
        "أي الإفراط في تعلّم كل ما في البيانات، حتّى الأخطاء\n",
        "و الشواذ\n",
        "الموجودة فيها. \n",
        "نقول بأنّ هناك *إفراطًا في التعلّم*\n",
        "عندما يكون أداء نموذج تعلّم آليّ\n",
        "(machine learning model)\n",
        " ما على بيانات \n",
        " لم يرها من قبل أثناء تعلّمه أسوء من أدائه على البيانات التّي رآها.\n",
        "النموذج المفرط في التعلّم يقوم بحفظ\n",
        "و تذكّر\n",
        "(memorizes)\n",
        "الضجيج و التفاصيل الموجودة في مجموعة بيانات التدريب \n",
        "إلى درجة تُضرّ بأداءه \n",
        "على بيانات جديدة.\n",
        "للإطلاع على المزيد من المعلومات عن هذا الموضوع، راجع المصادر التّالية:\n",
        "\n",
        "*   [إثبات وجود الإفراط في التعلّم](https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#demonstrate_overfitting?hl=ar)\n",
        "*   [استراتجيات الوقاية من الإفراط في التعلّم](https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#strategies_to_prevent_overfitting?hl=ar)\n",
        "\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "v-PyD1SYE28q"
      },
      "source": [
        "### <div dir=\"rtl\">القيام بالتنبؤات</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "يمكنك الآن القيام بتجربة النموذج على بعض الصور. \n",
        "تتمثّل مخرجات النموذج في صفيفة لوجيت \n",
        "([logits](https://developers.google.com/machine-learning/glossary#logits)).\n",
        "أضف طبقة \n",
        "softmax\n",
        "لتحويل صفيفة اللوجيت \n",
        "إلى احتمالات يسهل تفسيرها.  \n",
        "\n",
        "</div> "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DnfNA0CrQLSD"
      },
      "outputs": [],
      "source": [
        "probability_model = tf.keras.Sequential([model, \n",
        "                                         tf.keras.layers.Softmax()])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Gl91RPhdCaXI"
      },
      "outputs": [],
      "source": [
        "predictions = probability_model.predict(test_images)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "x9Kk1voUCaXJ"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "هنا، قام النموذج بتنبّؤ التسمية المناسبة لكلّ صورة في مجموعة الاختبار. \n",
        "لنلقي نظرة على أوّل تنبؤ: \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3DmJEUinCaXK"
      },
      "outputs": [],
      "source": [
        "predictions[0]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-hw1hgeSCaXN"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "كُلّ تنبؤ هو عبارة عن صفيف متكوّن من 10 أرقام. \n",
        "و هي تمثّل مدى \"ثقة\" النموذج بأنّ الصورة تتوافق مع كل فئة من فئات الملابس العشر المختلفة.\n",
        "يمكنك معرفة أي تسمية تحتوى على أعلى قيمة ثقة\n",
        "هكذا:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "qsqenuPnCaXO"
      },
      "outputs": [],
      "source": [
        "np.argmax(predictions[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "E51yS7iCCaXO"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "إذا، حسب النتيجة السابقة، فإنّ النموذج أكثر ثقة بأنّ هذه الصورة هي لحذاء كاحل، \n",
        "أي التمسية الموجودة في \n",
        "`class_names[9]`.\n",
        "و يأكّد فحص صفيفة تسميات الاختبار\n",
        "الموجود في\n",
        "`test_labels`\n",
        "بأنّ تصنيف النموذج صحيح:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Sd7Pgsu6CaXP"
      },
      "outputs": [],
      "source": [
        "test_labels[0]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ygh2yYC972ne"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "ارسم الصورة مع توقّعات النموذج العشرة لتتوضح النتائج بشكل أفضل.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DvYmmrpIy6Y1"
      },
      "outputs": [],
      "source": [
        "def plot_image(i, predictions_array, true_label, img):\n",
        "  predictions_array, true_label, img = predictions_array, true_label[i], img[i]\n",
        "  plt.grid(False)\n",
        "  plt.xticks([])\n",
        "  plt.yticks([])\n",
        "\n",
        "  plt.imshow(img, cmap=plt.cm.binary)\n",
        "\n",
        "  predicted_label = np.argmax(predictions_array)\n",
        "  if predicted_label == true_label:\n",
        "    color = 'blue'\n",
        "  else:\n",
        "    color = 'red'\n",
        "\n",
        "  plt.xlabel(\"{} {:2.0f}% ({})\".format(class_names[predicted_label],\n",
        "                                100*np.max(predictions_array),\n",
        "                                class_names[true_label]),\n",
        "                                color=color)\n",
        "\n",
        "def plot_value_array(i, predictions_array, true_label):\n",
        "  predictions_array, true_label = predictions_array, true_label[i]\n",
        "  plt.grid(False)\n",
        "  plt.xticks(range(10))\n",
        "  plt.yticks([])\n",
        "  thisplot = plt.bar(range(10), predictions_array, color=\"#777777\")\n",
        "  plt.ylim([0, 1])\n",
        "  predicted_label = np.argmax(predictions_array)\n",
        "\n",
        "  thisplot[predicted_label].set_color('red')\n",
        "  thisplot[true_label].set_color('blue')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Zh9yABaME29S"
      },
      "source": [
        "### <div dir=\"rtl\">تحقّق من التنبؤات</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "بعد إتمام تدريب النموذج، يمكنك استعماله للقيام بالتنبؤ بفئة الملابس الموجودة في بعض الصور. \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "d4Ov9OFDMmOD"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "لننظر في الصورة الأولى، الموجودة في المرتبة 0 في الصفيفة. و لنقارن تنبؤ النموذج على هذه الصورة بالتسمية الصحيحة الموجودة في\n",
        "`test_labels`.\n",
        "سوف نرسم التنبؤ الموافق للتسمية الصحيحة باللون الأزرق، و نرسم التنبؤات الخاطئة باللّون الأحمر. \n",
        "يمثّل العدد الموجود تحت الصورة \n",
        "النسبة (من 0 إلى 100)\n",
        "التي أعطاها النموذج للتسمية الأعلى ثقة. \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "HV5jw-5HwSmO"
      },
      "outputs": [],
      "source": [
        "i = 0\n",
        "plt.figure(figsize=(6,3))\n",
        "plt.subplot(1,2,1)\n",
        "plot_image(i, predictions[i], test_labels, test_images)\n",
        "plt.subplot(1,2,2)\n",
        "plot_value_array(i, predictions[i],  test_labels)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Ko-uzOufSCSe"
      },
      "outputs": [],
      "source": [
        "i = 12\n",
        "plt.figure(figsize=(6,3))\n",
        "plt.subplot(1,2,1)\n",
        "plot_image(i, predictions[i], test_labels, test_images)\n",
        "plt.subplot(1,2,2)\n",
        "plot_value_array(i, predictions[i],  test_labels)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kgdvGD52CaXR"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "لنقم برسم عدّة صور مع تنبؤاتها. \n",
        "لاحظ أنّ النموذج يمكن أن يكون على خطأ حتّى \n",
        "و إن كانت ثقته كبيرة في تنبؤه. \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hQlnbqaw2Qu_"
      },
      "outputs": [],
      "source": [
        "# Plot the first X test images, their predicted labels, and the true labels.\n",
        "# Color correct predictions in blue and incorrect predictions in red.\n",
        "num_rows = 5\n",
        "num_cols = 3\n",
        "num_images = num_rows*num_cols\n",
        "plt.figure(figsize=(2*2*num_cols, 2*num_rows))\n",
        "for i in range(num_images):\n",
        "  plt.subplot(num_rows, 2*num_cols, 2*i+1)\n",
        "  plot_image(i, predictions[i], test_labels, test_images)\n",
        "  plt.subplot(num_rows, 2*num_cols, 2*i+2)\n",
        "  plot_value_array(i, predictions[i], test_labels)\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R32zteKHCaXT"
      },
      "source": [
        "## <div dir=\"rtl\">استعمل النموذج المدرّب</div>\n",
        "\n",
        "<div dir=\"rtl\">\n",
        "\n",
        "أخيرًا، استخدم النموذج المدرّب للتنبؤ بصورة واحدة.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "yRJ7JU7JCaXT"
      },
      "outputs": [],
      "source": [
        "# Grab an image from the test dataset.\n",
        "img = test_images[1]\n",
        "\n",
        "print(img.shape)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vz3bVp21CaXV"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تمّ تطوير حزمة\n",
        "`tf.keras`\n",
        "لتقوم بالتنبؤ بشكل فعّال على دفعة\n",
        "من البيانات\n",
        "في آن واحد. \n",
        "وفقا لذلك، رغم أنّك ستستعمل صورة واحدة في المثال التّالي،\n",
        "فأنت بحاجة إلى إضافتها إلى قائمة\n",
        "(list):\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "lDFh5yF_CaXW"
      },
      "outputs": [],
      "source": [
        "# Add the image to a batch where it's the only member.\n",
        "img = (np.expand_dims(img,0))\n",
        "\n",
        "print(img.shape)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EQ5wLTkcCaXY"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "الآن قم باستخدام النموذج للتنبؤ بالتسمية المناسبة لهذه الصورة:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "o_rzNSdrCaXY"
      },
      "outputs": [],
      "source": [
        "predictions_single = probability_model.predict(img)\n",
        "\n",
        "print(predictions_single)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6Ai-cpLjO-3A"
      },
      "outputs": [],
      "source": [
        "plot_value_array(1, predictions_single[0], test_labels)\n",
        "_ = plt.xticks(range(10), class_names, rotation=45)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cU1Y2OAMCaXb"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تقوم الوظيفة \n",
        "`keras.Model.predict`\n",
        "بإرجاع قائمة قوائم \n",
        "(a list of lists)\n",
        "حيث أن كُلّ صورة في الدفعة سيكون لها قائمتها الخاصّة.\n",
        "استخرج التنبؤات للصورة الوحيدة في الدفعة السابقة:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2tRmdq_8CaXb"
      },
      "outputs": [],
      "source": [
        "np.argmax(predictions_single[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "YFc2HbEVCaXd"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "و كما نرى يتنبأ النموذج \n",
        "بالتسمية كما هو متوقّع.\n",
        "\n",
        "</div>"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [],
      "name": "classification.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
